# -*- coding:utf-8 -*-
# @Time:2024/4/1921:01
# @Author:miuzg
# @FileName:new test2.py
# @Software:PyCharm

import re
import requests
import pymysql


# 这样写的相对正规
# 1.获取页面 2.筛选数据 3.保存数据
class DouBanSpider(object):
    def __init__(self):
        self.url = 'https://movie.douban.com/top250?start={}&filter='
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0'
        }

        self.db = pymysql.connect(
            host='127.0.0.1',
            port=3306,
            database='520day6',
            user='root',
            passwd='root',
            charset='utf8'
        )
        self.cur = self.db.cursor()
        self.sql = 'insert into movieInfo(movie_name,director,star)values(%s,%s,%s)'

    def get_html(self, url):
        """获取网页数据"""
        res = requests.get(url, headers=self.headers)
        return res.text

    def parse_html(self, html):
        """
        筛选数据
            筛选数据时 正则不是最优解，
            xpath,bs4,selenium才是主流

            1.获取从info开始的数据
            2. .*?专业叫法叫非贪婪匹配符，表示任意数量字符，但是尽量少取 --> 这里的目的是跳过
            无用数据，知道我想要的数据出现位置
            3.想要的数据为class为title的span标签里的数据 --> 电影标题
            4.(.*?)捕获组，获取到数据利多内容，只要span里的信息，span标签不要
            5.下一个数据为有class属性但是没有class值的p标签 --> 导演+主演信息
            6.用(.*?)捕获组获取p标签里的内容
            7.re.S保留换行符
        """
        data = re.findall(r'<div class="info">.*?<span class="title">(.*?)</span>.*?<p class="">(.*?)</p>', html, re.S)
        self.save(data)

    def save(self,datas):
        """
        保存数据
            data里下标为0的数据为电影标题
                  下标为1的数据很杂

            有的电影没有导演或者主演信息，如果有就正常插入，。欸有就显示没有数据
        """
        for data in datas:
            movie_name = data[0]
            print(movie_name)
            director = re.findall('导演: (.*?)&nbsp;',data[1])
            star = re.findall('主演: (.*?)<br>',data[1])
            if not director:
                director = '没有导演信息'
            else:
                director = director[0]
            if not star:
                star = '没有主演信息'
            else:
                star = star[0]
            self.cur.execute(self.sql,(movie_name,director,star))
            self.db.commit()

    def run(self):
        """类的启动方法"""
        for start in range(0, 226, 25):
            url = self.url.format(start)  # 获取网页地址
            html = self.get_html(url)  # 获取网页数据
            self.parse_html(html)  # 筛选网页数据

        self.cur.close()
        self.db.close()


# 当前文件作为执行文件时才运行代码，作为模块就不运行
if __name__ == '__main__':
    spider = DouBanSpider()
    spider.run()
